package com.itany.shop.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author MissChen
 * @date 2024年05月17日 15:53
 */

@WebServlet("*.file")
public class FileServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path=request.getServletPath();
        switch (path){
            case "/upload.file":
                upload(request,response);
                break;
        }
    }

    public void upload(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // String username=request.getParameter("username");
        // String file=request.getParameter("file");
        // System.out.println(username);
        // System.out.println(file);
        // InputStream in=request.getInputStream();
        // byte[] b=new byte[10240];
        // int i=in.read(b);
        // System.out.println(new String(b,0,i));

        //通过IO的方式获取请求中的数据，但是对这些数据的解析是比较麻烦的
        // 因此可以使用第三方工具对这些数据进行解析，注意:工具做的就是解析操作，与上传无关

        //使用第三方工具进行解析，获取对应工具的解析工厂，用于存放解析器
        DiskFileItemFactory factory=new DiskFileItemFactory();

        //获取对应的解析器
        ServletFileUpload upload=new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");//设置编码格式,文件名就正常获取

        try {
            List<FileItem> fileItems=upload.parseRequest(request);
            Map<String,FileItem> map=new HashMap<>();
            for(FileItem fileItem:fileItems){
                // System.out.println("文件名"+fileItem.getName());
                // System.out.println("表单元素的内容或者文件内容:"+fileItem.getString("UTF-8"));

                // fileItem.getFieldName()用于获取请求中数据对应的key
                // System.out.println("name属性:"+fileItem.getFieldName());
                // System.out.println(fileItem.getContentType());

                //如果是非文件，getString()用于获取对应的数据，通过传递参数指定编码，如:getString("UTF-8")
                // if("username".equals(fileItem.getFieldName())){
                //     System.out.println("用户名:"+fileItem.getString());
                // }

                //如果是文件，getString()用于获取文件的内容
                // if("file".equals(fileItem.getFieldName())){
                //     System.out.println("文件名:"+fileItem.getName());
                //     System.out.println("文件内容:"+fileItem.getString("UTF-8"));
                // }

                // map.put("username",fileItem)  map.put("file",fileItem)
                map.put(fileItem.getFieldName(),fileItem);
            }

            // 开始上传，在服务器的根目录创建一个upload目录，每天上传的文件上传到对应的子目录年月日中去

            // 1.获取服务器的根目录，在相对于根目录的地址中指定upload目录以及子目录
            String path=getServletContext().getRealPath("/upload/"+new SimpleDateFormat("yyyyMMdd").format(new Date()));
            System.out.println(path);

            // 2.创建该路径所涉及到的所有目录
            File f=new File(path);
            f.mkdirs();//创建指定目录

            // 3.上传文件
            FileItem file=map.get("file");//从map集合中取出文件

            //文件名可能存在中文，需要处理
            // String fileName=new String(file.getName().getBytes(),"UTF-8");
            String fileName=file.getName();
            System.out.println(fileName);
            if(fileName.endsWith(".jsp")){
                request.setAttribute("uploadMsg","不允许上传jsp文件");
                request.getRequestDispatcher("/jsp/upload.jsp").forward(request,response);
                return;
            }

            //文件名可能存在重名的，可以为文件重命名，在每一个文件后面加上一个毫秒的后缀
            // aa.png     aa-当前日期的毫秒值.png
            fileName=fileName.substring(0,fileName.lastIndexOf("."))+"-"+new Date().getTime()+fileName.substring(fileName.lastIndexOf("."));
            file.write(new File(path,fileName));

        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
